home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
126-150
/
scopedisk146
/
liner
/
source
/
menu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
8KB
|
326 lines
#include "Globals.h"
#define FP 1 /*Pen for filenames in YAFR (white)*/
#define DP 3 /* " " dirnames " " (orange)*/
extern ColorReq();
/*I think most of these are self explanatory (HandleNew() handles the New*/
/*item in the Project menu, etc.)*/
void HandleNew()
{
if(Modified && !AreYouSure(Window))
return;
NewAll();
}
HandleOpen()
{
if(GetFilename(SFileName,SDirName,SExt,FileName,24,9,
"Enter filename for open",Screen,FP,DP,TRUE))
{
if(Modified)
if(!AreYouSure(Window))
return(FALSE);
if(ReadItemList(FileName,FALSE))
{
Modified=FALSE;
TitleErrorCancel(); /*Write current filename in title bar*/
} /*if there was no error*/
}
}
void Save(arexx)
BYTE arexx;
{
if(FileName[0]==NULL)
HandleSaveAs();
else
{
WriteItemList(FileName,arexx);
Modified=FALSE;
TitleErrorCancel();
}
}
void HandleSaveAs()
{
if(GetFilename(SFileName,SDirName,SExt,FileName,24,9,
"Enter filename for save",Screen,FP,DP,TRUE))
{
if(WriteItemList(FileName,FALSE)) /*Save As... never called from ARexx*/
{
Modified=FALSE;
TitleErrorCancel(); /*Update filename in title bar*/
} /*if there was no error*/
}
}
HandlePrintDisk(arexxstat,filename)
BYTE arexxstat; /*Called from arexx or not?*/
char *filename; /*Filename if called from ARexx*/
{
struct FileHandle *fp;
char chip buffer[90];
struct LineItem *Item;
if(arexxstat)
strcpy(PDName,filename);
else
if(!GetFilename(PFileName,PDirName,PExt,PDName,24,9,
"Enter filename for print",Screen,FP,DP,TRUE))
return(FALSE);
if((fp=(struct FileHandle *)Open(PDName,MODE_NEWFILE))==NULL)
{
if(!arexxstat)
TitleError("Can't open file!");
return(FALSE);
}
Item=(struct LineItem *)FirstItem;
while(Item != NULL)
{
MakeTextLine(buffer,Item);
Write(fp,buffer,strlen(buffer));
Item=(struct LineItem *)Item->NextItem;
}
Close(fp);
return(TRUE);
}
HandlePrintPrinter() /*Send an outline to the printer*/
{
struct FileHandle *fp;
char chip RetBuf[8];
char Printed=0;
char chip buffer[90];
struct LineItem *Item;
struct Preferences preferences;
UWORD maxlines;
if((fp=(struct FileHandle *)Open("prt:",MODE_OLDFILE))==NULL)
{
TitleError("Can't open printer!");
return(FALSE);
}
GetPrefs(&preferences,sizeof(struct Preferences));
maxlines=preferences.PaperLength-1; /*Get maximum page size*/
RetBuf[0]=0x0d;
RetBuf[1]=0x0a;
if(prefs.DS)
{
RetBuf[2]=0x0d;
RetBuf[3]=0x0a;
RetBuf[4]=0;
}
else
RetBuf[2]=0;
Item=(struct LineItem *)FirstItem;
while(Item != NULL)
{
for(Printed=2;Printed < maxlines && Item != NULL;
Printed+=(prefs.DS) ? 2 : 1)
{
strcpy(buffer,"");
GetOutlineChars(Item,buffer);
strcat(buffer," ");
strcat(buffer,Item->Text);
Write(fp,&buffer[Indent],strlen(&buffer[Indent]));
strcpy(buffer,RetBuf);
Write(fp,buffer,strlen(buffer));
Item=(struct LineItem *)Item->NextItem;
}
buffer[0]=NEWPAGE;
Write(fp,buffer,1);
}
Close(fp);
return(TRUE);
}
void HandleQuit()
{
if(Modified) /*Ask "Are you sure?" only if outline isn't saved*/
{
if(AreYouSure(Window))
CloseStuff();
}
else
CloseStuff();
}
HandleCut()
{
if(NOINV==InvsMode)
return(FALSE);
if(HandleCopy()) /*Copy to buffer. If it was successful,*/
HandleErase(); /*erase the block copied from*/
else
return(FALSE);
CheckModified();
}
HandleCopy()
{
struct WhichOne which;
if(ClipMode < NOINV)
FreeListMem(ClipStart,ClipEnd);
if(InvsMode > NOINV)
if(StartChar < EndChar)
WriteInvsTextToClip(StartChar,EndChar-StartChar+1,CurrentItem->Text);
else
WriteInvsTextToClip(EndChar,StartChar-EndChar+1,CurrentItem->Text);
else
{ /*Find the true start/end*/
FindStartEnd(StartIItem,EndIItem,&which);
/*If cutting out a bunch of continuations, get the parent and all*/
/*the child continuations as well*/
which.Start=(struct LineItem *)FindPrevNonCont(which.Start);
if((which.End = (struct LineItem *)FindNextNonCont(which.End))==NULL)
which.End=(struct LineItem *)LastItem;
if(which.End->NextItem != NULL && !which.End->cont &&
which.End->NextItem->cont)
return(FALSE);
if(!SnagBlock(which.Start,which.End))
return(FALSE);
}
ClipMode=InvsMode;
return(TRUE);
}
void HandlePaste()
{
int TempX,TempY;
char text[160];
CancelInvs();
CheckModified();
if(ClipMode < NOINV)
{
if((!CurrentItem->NextItem->cont) || (CurrentItem->NextItem == NULL))
AddBlock(CurrentItem);
}
else
{
strcpy(text,CurrentItem->Text);
ReadItemString(PosInText(CurrentItem->Level),
79-PosInText(CurrentItem->Level),text);
TempX=CurX;
PlotCursor(1,(TempY=CurY));
/*Break line apart if paste overruns the line*/
if(BreakLineApart(CurrentItem,CurrentItem->NextItem,
text)==CurrentItem)
PrintItem(CurrentItem);
else
PrintItemList(CurrentItem,CurY);
PlotCursor(TempX > MaxX(CurrentItem)?MaxX(CurrentItem):TempX,TempY);
}
}
HandleErase()
{
BYTE status=TRUE;
if(InvsMode==NOINV)
return(FALSE);
if(InvsMode > NOINV)
DelTextBlock();
else
status=HandleDelBlock();
if(status)
{
InvsMode=NOINV;
CheckModified();
}
}
void Refresh() /*Refresh the entire screen*/
{
UBYTE OldX,OldY;
OldX=CurX;
OldY=CurY;
PrintItemList(FirstScrnItem,1);
if(OldX < MinX(CurrentItem))
OldX=MinX(CurrentItem);
else
if(OldX > MaxX(CurrentItem))
OldX=MaxX(CurrentItem);
PlotCursor(OldX,OldY);
}
void CheckModified() /*Put an '*' in the title bar if it isn't there*/
{
if(Modified==FALSE)
{
Modified=TRUE;
TitleErrorCancel();
}
}
void MakeTextLine(Buffer,Item) /*Convert a LineItem into a text string*/
char *Buffer;
struct LineItem *Item;
{
UBYTE buflen;
strcpy(Buffer,"");
GetOutlineChars(Item,Buffer); /*Get the number*/
strcat(Buffer," ");
strcat(Buffer,Item->Text); /*Append the text*/
buflen=strlen(Buffer);
Buffer[buflen]=0x0a;
if(prefs.DS)
{
Buffer[buflen+1]=0x0a;
Buffer[buflen+2]=NULL;
}
else
Buffer[buflen+1]=NULL;
}
void HandlePalette() /*Change the color palette*/
{
ColorReq(Screen);
SaveColors(&(Screen->ViewPort));
}
void HandleReloadPrefs()
{
UBYTE X,Y;
X=CurX;
Y=CurY;
GetLinerPrefs("liner:liner.prefs"); /*Get the preferences from disk*/
CloseGraphics();
ClearMenus();
InterpretPrefs(); /*Install them*/
PrintItemList(FirstScrnItem,1); /*Restore the current outline*/
if(Y > DispRows) /*if the old laced Y is > the current possible rows*/
{
Y=DispRows; /*Y now = the last screen item*/
CurrentItem=(struct LineItem *)ScrnBtm;
}
if(X > MaxX(CurrentItem)) /*Out of bounds*/
X=MaxX(CurrentItem);
else if(X < MinX(CurrentItem))
X=MinX(CurrentItem);
PlotCursor(X,Y); /*Restore cursor position*/
}
/*End of menu.c*/